}
/* let's inject this interrupt */
TRACE_3D(TRC_VMX_INT, v->domain->domain_id, intr_vector, 0);
- svm_inject_extint(v, intr_vector, VMX_INVALID_ERROR_CODE);
+ svm_inject_extint(v, intr_vector, VMX_DELIVER_NO_ERROR_CODE);
interrupt_post_injection(v, intr_vector, intr_type);
break;
case VLAPIC_DELIV_MODE_SMI:
case VLAPIC_DELIV_MODE_EXT:
case VLAPIC_DELIV_MODE_FIXED:
case VLAPIC_DELIV_MODE_LPRI:
- vmx_inject_extint(v, highest_vector, VMX_INVALID_ERROR_CODE);
+ vmx_inject_extint(v, highest_vector, VMX_DELIVER_NO_ERROR_CODE);
TRACE_3D(TRC_VMX_INT, v->domain->domain_id, highest_vector, 0);
break;
case VLAPIC_DELIV_MODE_SMI:
/* don't bother H/W interrutps */
if (exit_reason != EXIT_REASON_EXTERNAL_INTERRUPT &&
exit_reason != EXIT_REASON_VMCALL &&
- exit_reason != EXIT_REASON_IO_INSTRUCTION)
+ exit_reason != EXIT_REASON_IO_INSTRUCTION)
HVM_DBG_LOG(DBG_LEVEL_0, "exit reason = %x", exit_reason);
if (exit_reason & VMX_EXIT_REASONS_FAILED_VMENTRY) {
__update_guest_eip(inst_len);
break;
}
+#if 0 /* keep this for debugging */
case EXIT_REASON_VMCALL:
__get_instruction_length(inst_len);
__vmread(GUEST_RIP, &eip);
hvm_print_line(v, regs.eax); /* provides the current domain */
__update_guest_eip(inst_len);
break;
+#endif
case EXIT_REASON_CR_ACCESS:
{
__vmread(GUEST_RIP, &eip);
case EXIT_REASON_MWAIT_INSTRUCTION:
__hvm_bug(®s);
break;
+ case EXIT_REASON_VMCALL:
+ case EXIT_REASON_VMCLEAR:
+ case EXIT_REASON_VMLAUNCH:
+ case EXIT_REASON_VMPTRLD:
+ case EXIT_REASON_VMPTRST:
+ case EXIT_REASON_VMREAD:
+ case EXIT_REASON_VMRESUME:
+ case EXIT_REASON_VMWRITE:
+ case EXIT_REASON_VMOFF:
+ case EXIT_REASON_VMON:
+ /* Report invalid opcode exception when a VMX guest tries to execute
+ any of the VMX instructions */
+ vmx_inject_exception(v, TRAP_invalid_op, VMX_DELIVER_NO_ERROR_CODE);
+ break;
+
default:
__hvm_bug(®s); /* should not happen */
}
#define PC_DEBUG_PORT 0x80
-#define VMX_INVALID_ERROR_CODE -1
+#define VMX_DELIVER_NO_ERROR_CODE -1
/*
* This works for both 32bit & 64bit eflags filteration
#define EXIT_REASON_RDPMC 15
#define EXIT_REASON_RDTSC 16
#define EXIT_REASON_VMCALL 18
-
+#define EXIT_REASON_VMCLEAR 19
+#define EXIT_REASON_VMLAUNCH 20
+#define EXIT_REASON_VMPTRLD 21
+#define EXIT_REASON_VMPTRST 22
+#define EXIT_REASON_VMREAD 23
+#define EXIT_REASON_VMRESUME 24
+#define EXIT_REASON_VMWRITE 25
+#define EXIT_REASON_VMOFF 26
+#define EXIT_REASON_VMON 27
#define EXIT_REASON_CR_ACCESS 28
#define EXIT_REASON_DR_ACCESS 29
#define EXIT_REASON_IO_INSTRUCTION 30
/* Reflect it back into the guest */
intr_fields = (INTR_INFO_VALID_MASK | type | trap);
- if (error_code != VMX_INVALID_ERROR_CODE) {
+ if (error_code != VMX_DELIVER_NO_ERROR_CODE) {
__vmwrite(VM_ENTRY_EXCEPTION_ERROR_CODE, error_code);
intr_fields |= INTR_INFO_DELIEVER_CODE_MASK;
}
if (vector & INTR_INFO_DELIEVER_CODE_MASK)
__vmread(VM_EXIT_INTR_ERROR_CODE, &error_code);
else
- error_code = VMX_INVALID_ERROR_CODE;
+ error_code = VMX_DELIVER_NO_ERROR_CODE;
vector &= 0xff;
#ifndef NDEBUG